{"componentChunkName":"component---src-templates-bootcamp-js","path":"/bootcamp/misc/HISTORY/","result":{"data":{"site":{"siteMetadata":{"title":"William Blogs & More","description":"team knowledge base"}},"allBootcamp":{"edges":[{"node":{"fields":{"id":"410a853e-19db-5ecf-9193-d90fd4e2b164","slug":"/README/","title":"README"}}},{"node":{"fields":{"id":"ebd8a7a9-4f93-5f7f-89b4-7a921fc850fd","slug":"/backend/DEV/","title":"DEV"}}},{"node":{"fields":{"id":"c97bf13a-dd3f-5e0b-9f0a-9c5f08a42d57","slug":"/backend/Restful/","title":"Restful"}}},{"node":{"fields":{"id":"81e9e69e-bf6a-51e5-843d-7b4321c330f9","slug":"/backend/curl/","title":"Curl"}}},{"node":{"fields":{"id":"2aa2ab91-e4c3-59d3-ae10-2949c78bbba2","slug":"/backend/express/","title":"Express"}}},{"node":{"fields":{"id":"923aee4e-1ea6-5b5c-9dbf-7f3ed2ccd8de","slug":"/backend/flow/","title":"Flow"}}},{"node":{"fields":{"id":"735e010f-fe92-58c2-a717-44e1379ec81a","slug":"/backend/microservice/","title":"Microservice"}}},{"node":{"fields":{"id":"5257ef00-003a-505c-9681-90b156b2fdc3","slug":"/backend/mongo/","title":"Mongo"}}},{"node":{"fields":{"id":"5d7e4d14-bbe0-51e7-ac00-aed822be865d","slug":"/backend/nodejs/","title":"Nodejs"}}},{"node":{"fields":{"id":"04e0f6cd-ba6d-5bcb-a711-f978053c85a9","slug":"/backend/pg/","title":"Pg"}}},{"node":{"fields":{"id":"07933914-1441-5d9a-93b3-7b8527f32834","slug":"/backend/rabbitmq/","title":"Rabbitmq"}}},{"node":{"fields":{"id":"aeee00c3-e65a-5e57-8e26-99bdee4b5972","slug":"/backend/redis/","title":"Redis"}}},{"node":{"fields":{"id":"5efa4932-4a43-5627-a52e-d6c44ea1ce37","slug":"/backend/socket/","title":"Socket"}}},{"node":{"fields":{"id":"2546451c-541b-5d1f-b34c-1f1842685cfc","slug":"/bestitconsulting/Bootcamp/1-bootcamp/","title":"1 Bootcamp"}}},{"node":{"fields":{"id":"3ce1ed0e-ce4c-53b6-89a3-dd5dc7642647","slug":"/bestitconsulting/Bootcamp/2-release_branch/","title":"2 Release_branch"}}},{"node":{"fields":{"id":"e3f26574-c4e6-5058-8336-6e761d369455","slug":"/bestitconsulting/Bootcamp/3-coding/","title":"3 Coding"}}},{"node":{"fields":{"id":"8b752412-b3d3-5bbe-87b3-d99ef91d2759","slug":"/bestitconsulting/Bootcamp/4-testing/","title":"4 Testing"}}},{"node":{"fields":{"id":"e950ea75-d6c1-5fca-8e1c-4b4fce362fab","slug":"/bestitconsulting/Bootcamp/5-CICD/","title":"5 CICD"}}},{"node":{"fields":{"id":"739b0238-56b4-5a47-bc76-3286eadcb425","slug":"/bestitconsulting/Bootcamp/6-BA/","title":"6 BA"}}},{"node":{"fields":{"id":"bc2e6ad3-6b39-54b0-8d66-e5e295f331ee","slug":"/bestitconsulting/Bootcamp/QA/","title":"QA"}}},{"node":{"fields":{"id":"484882b7-848a-591f-80d5-24d045cb9582","slug":"/bestitconsulting/Bootcamp/README/","title":"README"}}},{"node":{"fields":{"id":"27252ae9-1261-5b83-9039-45c41697c09d","slug":"/bestitconsulting/Bootcamp/Reference/","title":"Reference"}}},{"node":{"fields":{"id":"2a271bc5-0775-5cb0-99ab-056d5c0cf09f","slug":"/bestitconsulting/courses/agile/","title":"Agile"}}},{"node":{"fields":{"id":"372866f9-ffd2-5576-bbc1-415732492686","slug":"/bestitconsulting/courses/grow-admin/","title":"Grow Admin"}}},{"node":{"fields":{"id":"5eb7bdc4-c171-52bc-bf48-f413de03ea24","slug":"/bestitconsulting/courses/learn-suite/","title":"Learn Suite"}}},{"node":{"fields":{"id":"986b6381-1b35-5253-93d5-1294d4984202","slug":"/bestitconsulting/courses/security/","title":"Security"}}},{"node":{"fields":{"id":"8e3b3436-48d9-57f8-9d53-71494461a76e","slug":"/bestitconsulting/radar/github-radar-1/","title":"Github Radar 1"}}},{"node":{"fields":{"id":"f9b1b128-a118-5569-b2ee-b6d5c347e964","slug":"/bestitconsulting/radar/github-radar/","title":"Github Radar"}}},{"node":{"fields":{"id":"17a02ec4-b391-54f1-8c60-922492f1a5eb","slug":"/bigdata/1-bigdata/","title":"1 Bigdata"}}},{"node":{"fields":{"id":"36884170-cd04-548a-9a00-77e36a4b1380","slug":"/bigdata/2-hadoop/","title":"2 Hadoop"}}},{"node":{"fields":{"id":"c9cdff49-84d1-58e6-bf25-926b7f68d84c","slug":"/bigdata/201-kafka-4/","title":"201 Kafka 4"}}},{"node":{"fields":{"id":"f2387a56-a470-54c8-94aa-182fffbab8b0","slug":"/bigdata/201-nosql-8/","title":"201 Nosql 8"}}},{"node":{"fields":{"id":"4d3d0dd0-c311-51f6-9975-80fd4c5fa752","slug":"/bigdata/201-streaming-5/","title":"201 Streaming 5"}}},{"node":{"fields":{"id":"27a22e9e-6aa2-5c4e-9edf-c06b8740246d","slug":"/bigdata/3-hdfs/","title":"3 Hdfs"}}},{"node":{"fields":{"id":"f80ad3db-5700-5e3b-a5ae-2e6f5dc0c886","slug":"/bigdata/4-devops/","title":"4 Devops"}}},{"node":{"fields":{"id":"07672f34-d70e-589c-ba8e-67e284bc1d8c","slug":"/bigdata/5-hive/","title":"5 Hive"}}},{"node":{"fields":{"id":"bf3a9766-31fd-5213-8dd9-7c38ebe7bb80","slug":"/bigdata/6-spark/","title":"6 Spark"}}},{"node":{"fields":{"id":"4dab467f-b6ea-531b-8c28-9bcef71863e4","slug":"/bigdata/7-docker/","title":"7 Docker"}}},{"node":{"fields":{"id":"7ee4ff75-d3f8-5c1a-b701-facf126f3450","slug":"/bigdata/8-streaming/","title":"8 Streaming"}}},{"node":{"fields":{"id":"6785ce66-99e5-5e00-af30-b1c32c61cb12","slug":"/bigdata/9-elasticsearch/","title":"9 Elasticsearch"}}},{"node":{"fields":{"id":"9a59f47c-4cd3-51db-9962-2ffb26b14dc4","slug":"/bigdata/hdfs-kubernetes/","title":"Hdfs Kubernetes"}}},{"node":{"fields":{"id":"819a354c-d042-54db-9466-5063d21db45f","slug":"/bigdata/kubernetes/","title":"Kubernetes"}}},{"node":{"fields":{"id":"4535d21c-0f79-5cda-b235-98658a1ffe1f","slug":"/bigdata/spark-kubernetes/","title":"Spark Kubernetes"}}},{"node":{"fields":{"id":"07d1d0ca-dc16-52b5-b911-0d128a2388eb","slug":"/bigdata2/README/","title":"README"}}},{"node":{"fields":{"id":"605faba4-a685-5a80-a80a-5130700509e3","slug":"/bigdata2/TODO/","title":"TODO"}}},{"node":{"fields":{"id":"5b1a9498-e94f-5dba-a4fa-9aa2f3da4312","slug":"/bigdata2/editor/","title":"Editor"}}},{"node":{"fields":{"id":"6e1973a3-4045-57b9-a096-d498f5d2802b","slug":"/bigdata2/hadoop/","title":"Hadoop"}}},{"node":{"fields":{"id":"e63f21ad-65e0-56db-891e-60a89c5f93da","slug":"/bigdata2/kafka/","title":"Kafka"}}},{"node":{"fields":{"id":"2efc1fee-93bd-53eb-b5e0-672ff2acc9a4","slug":"/bigdata2/scala/","title":"Scala"}}},{"node":{"fields":{"id":"001e1d27-4cba-5926-ba33-8197e2065136","slug":"/bigdata2/spark/","title":"Spark"}}},{"node":{"fields":{"id":"2e2078b0-b734-5ae3-873c-022349c1c3cf","slug":"/bigdata2/vscode/","title":"Vscode"}}},{"node":{"fields":{"id":"b52de8e7-4791-556a-9989-b84717cd3370","slug":"/bigdata2/web-resource/","title":"Web Resource"}}},{"node":{"fields":{"id":"e0378d10-6064-560e-a6b2-cbe89a820d26","slug":"/bigdata2/zookeeper/","title":"Zookeeper"}}},{"node":{"fields":{"id":"616110f5-9073-5438-846b-ff7584d4e922","slug":"/cloud/aws/","title":"Aws"}}},{"node":{"fields":{"id":"c788368a-0f0e-5661-8fe9-c469d5a278d8","slug":"/cloud/azure/","title":"Azure"}}},{"node":{"fields":{"id":"30bec85f-fc28-5638-b42d-a952b414de7c","slug":"/cloud/elk/","title":"Elk"}}},{"node":{"fields":{"id":"57773e69-6a69-5e86-a641-af37ffe1ad40","slug":"/cloud/gcp/","title":"Gcp"}}},{"node":{"fields":{"id":"6688fe10-a20c-5479-bc80-170063d3e58c","slug":"/frontend/apollo/","title":"Apollo"}}},{"node":{"fields":{"id":"09e2c05f-9d10-5776-8fe8-44e9a565a20e","slug":"/frontend/graphql/","title":"Graphql"}}},{"node":{"fields":{"id":"28d38d20-c6e2-50ae-ac83-d3e3b9f25248","slug":"/frontend/proxy/","title":"Proxy"}}},{"node":{"fields":{"id":"ca4444ea-9796-5d40-98e1-c01d80f88221","slug":"/frontend/react-router/","title":"React Router"}}},{"node":{"fields":{"id":"61e06420-e9e4-5aa4-9d71-bf618be3f4fe","slug":"/frontend/react/","title":"React"}}},{"node":{"fields":{"id":"9d95393b-96be-5065-83bb-536b746eed21","slug":"/frontend/redux/","title":"Redux"}}},{"node":{"fields":{"id":"e3bb0f44-4819-556c-8511-7402303e36c5","slug":"/misc/0428/","title":"0428"}}},{"node":{"fields":{"id":"dfcc8a86-17af-5c8c-b831-9fe4fa51bf0e","slug":"/misc/HISTORY/","title":"HISTORY"}}},{"node":{"fields":{"id":"6f004260-a55d-5a2d-8146-d197509fd980","slug":"/misc/TODO/","title":"TODO"}}},{"node":{"fields":{"id":"30096e9c-2593-5fc8-80d5-1f7648898888","slug":"/misc/git/","title":"Git"}}},{"node":{"fields":{"id":"bed21539-b0d7-5936-9c15-96905db68ac9","slug":"/misc/gitlab/","title":"Gitlab"}}},{"node":{"fields":{"id":"ab43544c-0ef1-56d2-a0a3-035fdd1cf7fe","slug":"/misc/installation/","title":"Installation"}}},{"node":{"fields":{"id":"b2e02e77-9623-5967-a541-fe1829315b47","slug":"/misc/misc/","title":"Misc"}}},{"node":{"fields":{"id":"4c7d96dc-fddc-52fd-9333-9fa6d2633874","slug":"/misc/vocabulary/","title":"Vocabulary"}}},{"node":{"fields":{"id":"f2a8cc1a-8b27-541c-b68e-8c5dc6d0f6b3","slug":"/poc/courses/agile/","title":"Agile"}}},{"node":{"fields":{"id":"ae6e68d8-0f75-5fac-ad96-f042bddd50aa","slug":"/poc/courses/grow-admin/","title":"Grow Admin"}}},{"node":{"fields":{"id":"689b1b72-e7b6-5b07-9890-50f653fdd7df","slug":"/poc/courses/learn-suite/","title":"Learn Suite"}}},{"node":{"fields":{"id":"003c5b81-20aa-57aa-b268-17aaaa338e68","slug":"/poc/courses/security/","title":"Security"}}},{"node":{"fields":{"id":"e0f53ac9-fbe0-5c72-8b69-ee2cce387f90","slug":"/poc/radar/github-radar-1/","title":"Github Radar 1"}}},{"node":{"fields":{"id":"c5718e38-5cc1-566e-a649-a4d501877995","slug":"/poc/radar/github-radar/","title":"Github Radar"}}},{"node":{"fields":{"id":"5a68cfb3-1b53-5527-a6ad-b8277381fab4","slug":"/poc/radar/steps/","title":"Steps"}}}]},"bootcamp":{"fields":{"id":"dfcc8a86-17af-5c8c-b831-9fe4fa51bf0e","title":"HISTORY","slug":"/misc/HISTORY/","tag":"misc","category":"bootcamp","date":"2021-02-16","size":8270},"html":"<h1 id=\"update-history\" style=\"position:relative;\"><a href=\"#update-history\" aria-label=\"update history permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Update History</h1>\n<p>This is the walking steps of Dan Abramov’s Redux vedio tutorials.</p>\n<p><code class=\"language-text\">Part 2: Building React Applications with Idiomatic Redux (27 free videos)</code>\n<a href=\"https://egghead.io/courses/building-react-applications-with-idiomatic-redux\">https://egghead.io/courses/building-react-applications-with-idiomatic-redux</a></p>\n<p>There are total 10 branches (step-1…step-9, main) to go through the video episodes.</p>\n<h2 id=\"branches\" style=\"position:relative;\"><a href=\"#branches\" aria-label=\"branches permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Branches</h2>\n<h3 id=\"1-step-1\" style=\"position:relative;\"><a href=\"#1-step-1\" aria-label=\"1 step 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. step-1</h3>\n<p>grab the source code from: <a href=\"https://github.com/reactjs/redux/tree/master/examples/todos\">https://github.com/reactjs/redux/tree/master/examples/todos</a>\nconfig package.json, add webpack.config.js, do some updating, use <code class=\"language-text\">webpack-dev-server</code> to make the source working properly.</p>\n<h3 id=\"2-step-2\" style=\"position:relative;\"><a href=\"#2-step-2\" aria-label=\"2 step 2 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. step-2</h3>\n<p>initial state in HTML 5 Local-storage.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\">  store<span class=\"token punctuation\">.</span><span class=\"token function\">subscribe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">saveState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token string\">'todos'</span><span class=\"token operator\">:</span> store<span class=\"token punctuation\">.</span><span class=\"token function\">getState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>add <code class=\"language-text\">node-uuid.v4</code>, <code class=\"language-text\">lodash/Throttle</code> for subscribe(saveState) </p>\n<h3 id=\"3-step-3\" style=\"position:relative;\"><a href=\"#3-step-3\" aria-label=\"3 step 3 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. step-3</h3>\n<ul>\n<li>seperate js to Root, configureStore</li>\n<li>use react-router <code class=\"language-text\">Link</code> for hashHistory URL.</li>\n<li>add removeState to reset localStorage’s state to prove it work.</li>\n</ul>\n<h3 id=\"4-step-4\" style=\"position:relative;\"><a href=\"#4-step-4\" aria-label=\"4 step 4 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. step-4</h3>\n<ul>\n<li>debug: devtool: ‘inline-source-map’,</li>\n<li>FilterLink not work correct. (step-3 either)</li>\n</ul>\n<h3 id=\"6-step-6\" style=\"position:relative;\"><a href=\"#6-step-6\" aria-label=\"6 step 6 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. step-6</h3>\n<ul>\n<li>favicon</li>\n<li>mongod &#x26;&#x26; mongoose</li>\n<li>routes: /api/todos, models</li>\n<li>server:\n“webpack-dev-middleware”,\n“webpack-hot-middleware”</li>\n</ul>\n<p>try to integrate williamDemo (Redux Universal) and react-redux-universal-hot-example into.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\">mongod <span class=\"token operator\">&amp;</span>\n<span class=\"token function\">npm</span> run start1 \n<span class=\"token function\">open</span> http://localhost:8081\n<span class=\"token function\">open</span> http://localhost:/8081/api/routes/</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>re-cast <code class=\"language-text\">getVisibleTodos</code> to <code class=\"language-text\">reducers</code> as a <code class=\"language-text\">selector</code>, so <code class=\"language-text\">mapStateToProps</code> use <code class=\"language-text\">state</code> instead of <code class=\"language-text\">state.todos</code>.</p>\n<p>work at course-15.</p>\n<h3 id=\"7-step-7\" style=\"position:relative;\"><a href=\"#7-step-7\" aria-label=\"7 step 7 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. step-7</h3>\n<p><code class=\"language-text\">users</code> tab works. It uses mongo + redux global state + react component.</p>\n<ul>\n<li>redux-thunk</li>\n<li>componentDidMount to call store.dispatch(‘FETCH_USER’)</li>\n<li>in userAction.js, superagent.get(‘/api/users’) to get the user-list</li>\n<li>in userReducer.js, state is updated with the user-list</li>\n<li>in userApp.js, <code class=\"language-text\">mapStateToProps</code> update state.userList</li>\n<li>in userApp.js, render is trigger coz state.userList is changed.</li>\n</ul>\n<p><code class=\"language-text\">http://localhost:8081/users</code></p>\n<ul>\n<li>userList clicks and userDetail work.</li>\n<li>karma-test works.</li>\n<li>re-config the structure, bring (mv) stuff from previous <code class=\"language-text\">williamDemo</code> repository.\nI prefer to make this repository as a template for <code class=\"language-text\">react-redux-fullstack</code>, so step by step to integrate some good stuff.</li>\n<li><a href=\"https://github.com/erikras/redux-form\">Redux-form</a></li>\n<li>adjust the structure: replace db (todo -> redux), add new schemas. mv all todos name-convenention to redux-…</li>\n<li>make counter &#x3C;-> mongo &#x3C;-> state works. localhost:8081/counter localhost:8081/users work.</li>\n<li>counter CRUD works. superagent + findOneAndUpdate\nlocalhost:8081/counter works as a full-stack behavior. mongodb keeps sync with counter-clicking.</li>\n</ul>\n<h3 id=\"8-step-8\" style=\"position:relative;\"><a href=\"#8-step-8\" aria-label=\"8 step 8 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. step-8</h3>\n<p>checkout -b from step-6, at course-16. </p>\n<ul>\n<li>install redux-thunk, in configureStore.js use it.\nThe inner function receives the store methods dispatch and getState as parameters.\n</li>\n<li>merge step-8 and step-7. currently the tabs:\n(1) counter, users, contact works.\n(2) app, todos not work.\n(3) about, phone not implement yet.\n</li>\n</ul>\n<h3 id=\"9-step-9\" style=\"position:relative;\"><a href=\"#9-step-9\" aria-label=\"9 step 9 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9. step-9</h3>\n<ul>\n<li><a href=\"https://jsonplaceholder.typicode.com/\">https://jsonplaceholder.typicode.com/</a>\nFake Online REST API for Testing and Prototyping</li>\n<li>request</li>\n<li>Cross Domain issues:\nError: Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.</li>\n<li>to make promise testable: add <code class=\"language-text\">chai-as-promised</code>, and in karma.conf.js:\nfiles: [\n‘node_modules/babel-polyfill/dist/polyfill.js’,\n…\n]</li>\n<li>use <code class=\"language-text\">react-route-dom</code> instead of <code class=\"language-text\">react-route</code></li>\n<li>use react v15.4.0 instead of v15.5.3 to avoid warning</li>\n<li>change form <code class=\"language-text\">onSubmit={this.props.handleSubmit}</code> to <code class=\"language-text\">onSubmit={(e)=&gt;this.props.handleSubmit(e)}</code> to fix fetching github repository no-return issue.</li>\n<li>use ‘/api/delegate/…’ in server-side (<code class=\"language-text\">request.js</code>) to delegate accessing security website work.</li>\n</ul>\n<h3 id=\"10-main\" style=\"position:relative;\"><a href=\"#10-main\" aria-label=\"10 main permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10. Main</h3>\n<ul>\n<li>component must be first-letter capitalize: <code class=\"language-text\">editModal</code> not work, <code class=\"language-text\">EditModal</code> work.</li>\n<li>usersList: CRUD works (redux-form + react-bootstrap-modal)</li>\n<li>\n<p>redux-form:\n— use <code class=\"language-text\">initialValues</code> to fill up the edit-form.\n— <code class=\"language-text\">Field</code> should have <code class=\"language-text\">onChange</code>, otherwise the input can’t edit, even nothing to do:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\">onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>— rewrite add/edit userReucer, use map, concat.\n— pass user.<em>id as hidden: &#x3C;input name=”</em>id” type=“hidden” /></p>\n</li>\n<li>the tabs <code class=\"language-text\">todoApp</code>, <code class=\"language-text\">users</code>, <code class=\"language-text\">counter</code> all interact with MongoDB data.</li>\n<li><code class=\"language-text\">rxjs@5.3.0</code>, <code class=\"language-text\">redux-observable</code> will be used in input-search</li>\n<li><code class=\"language-text\">isomorphic-fetch</code> to use fetch alongside with superagent, for caching and performance reason.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\">connect <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">assign</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> ownProps<span class=\"token punctuation\">,</span> stateProps<span class=\"token punctuation\">,</span> dispatchProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<ul>\n<li>in <code class=\"language-text\">Users</code> tab, add <code class=\"language-text\">search user</code> input box, to search user ‘fistName’ or ‘lastName’</li>\n<li>add <code class=\"language-text\">redux-observable</code> for <code class=\"language-text\">search</code> criteria\nso this works: react + redux + rxjs (redux-observable)</li>\n<li>add <code class=\"language-text\">debounceTime</code> for fetchUserEpic</li>\n<li>add more search logic: put onChange event in search component instead of its parent; update onChange when search-criteria is empty </li>\n<li>\n<p>update server/routes/users.js for <code class=\"language-text\">/api/users/search?search_criteria</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\">   <span class=\"token string\">'$or'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> <span class=\"token punctuation\">{</span>firstName<span class=\"token operator\">:</span> regexp<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>lastName<span class=\"token operator\">:</span> regexp<span class=\"token punctuation\">}</span> <span class=\"token punctuation\">]</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n</li>\n<li>move <code class=\"language-text\">import orderBy from &#39;lodash/orderBy&#39;</code> to reducer file which it is called.  </li>\n<li>add optional parameter for URL <code class=\"language-text\">react-router-dom-v4</code>: <Route path=\"/to/page/:pathParam?\" component={MyPage} /></li>\n<li>add sub-menu (sub-navigator) in <code class=\"language-text\">Topics</code></li>\n<li>add options to input counter from URL-params, like: <a href=\"http://localhost:8081/counter/18\">http://localhost:8081/counter/18</a></li>\n<li>add .scss, .gif <code class=\"language-text\">style-loader</code></li>\n<li>add loginApp logic</li>\n<li>add <code class=\"language-text\">Redirect</code></li>\n<li>add actionCreator and reducers for <code class=\"language-text\">login</code> and <code class=\"language-text\">logout</code></li>\n<li>add server-side routes <code class=\"language-text\">auth</code> for login fetch.</li>\n<li>user <code class=\"language-text\">token</code> property for future extension.</li>\n<li>add <code class=\"language-text\">react-bootstrap</code>, <code class=\"language-text\">react-router-bootstrap</code> for responsive menu.</li>\n<li>\n<p>add toggle login/logout works: add <code class=\"language-text\">state.token</code> in Root.js, just like in LoginApp.js, so these 2 parts are sync when login/logout.\nreact-redux-universal-hot-example:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">logout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\ntypes<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token constant\">LOGOUT</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">LOGOUT_SUCCESS</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">LOGOUT_FAIL</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token function-variable function\">promise</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">client</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> client<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/logout'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n</li>\n</ul>\n<h2 id=\"unit-test\" style=\"position:relative;\"><a href=\"#unit-test\" aria-label=\"unit test permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Unit Test</h2>\n<ul>\n<li>use karma + mocha + chai + sinon + webpack to make test (folder) works, need a lot of npm-modules.</li>\n<li>in package.json <code class=\"language-text\">scripts</code>:\n“immutable”: “mocha —compilers js:babel-core/register —require ./test/helper.js  —recursive”\ndoes the same thing as karma.conf.js</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\">ncu\nncu -u\n<span class=\"token function\">npm</span> update\nkarma start karma.conf.js</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<ul>\n<li><code class=\"language-text\">chai-as-promised</code> to test promise: either <code class=\"language-text\">return promise</code> or <code class=\"language-text\">done()</code> will work: test/promise.spec.js.</li>\n<li><code class=\"language-text\">immutable</code> and `chai-immutable installed and test.</li>\n<li><code class=\"language-text\">react-bootstrap</code> throw warning (propTypes) with React ^15.4, ^15.5.</li>\n</ul>\n<h2 id=\"issues\" style=\"position:relative;\"><a href=\"#issues\" aria-label=\"issues permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Issues:</h2>\n<ul>\n<li>react-router version: V4 not work. Video use V2.4, I use ^3.0, then <code class=\"language-text\">npm update</code></li>\n<li>use react-router-dom instead. remove react-router, and react-router-bootstrap.</li>\n<li>Warning: Accessing PropTypes via the main React package is deprecated. Use the prop-types package from npm instead.\nafter <code class=\"language-text\">npm i -S prop-types</code>, the warning is disappear. so fix.</li>\n<li>RESTFul API call Error: Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.</li>\n</ul>\n<p>o:  /api/users\nx:  /api/delegate/github/williamjxj\nx:  <a href=\"http://localhost:8081/api/delegate/jsonplaceholder\">http://localhost:8081/api/delegate/jsonplaceholder</a></p>\n<ul>\n<li>ERROR in ./~/css-loader!./~/sass-loader/lib/loader.js!./src/style.scss: Module build failed: Error: Cannot find module ‘node-sass’\nnpm i -D node-sass (npm rebuild node-sass)\nIt works. What’s the relationship btw <code class=\"language-text\">sass</code> and <code class=\"language-text\">scss</code>?</li>\n</ul>\n<h2 id=\"reference\" style=\"position:relative;\"><a href=\"#reference\" aria-label=\"reference permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reference</h2>\n<ul>\n<li>react-router version: V4 not work. Video use V2.4, I use ^3.0, then <code class=\"language-text\">npm update</code>\nreact-router                ^3.0.0  →  ^4.0.0</li>\n</ul>\n<p>Use <code class=\"language-text\">react-router-dom</code> instead:\n<a href=\"https://reacttraining.com/react-router/web/api/Route/Route-render-methods\">https://reacttraining.com/react-router</a></p>\n<ul>\n<li>use <code class=\"language-text\">Link, NavLink</code> from <code class=\"language-text\">react-router-dom</code>.</li>\n<li><a href=\"https://github.com/WilliamJiang/node-xml-xslt\">https://github.com/WilliamJiang/node-xml-xslt</a></li>\n<li>docs/flow.md</li>\n<li>react-boilerplate:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\">  $ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> -g create-react-app\n  $ create-react-app demo-app\n  $ <span class=\"token builtin class-name\">cd</span> demo-app</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"things-to-todo\" style=\"position:relative;\"><a href=\"#things-to-todo\" aria-label=\"things to todo permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Things to TODO</h2>\n<ul>\n<li>http-proxy</li>\n<li>socket</li>\n<li>node-debug, node-inspector</li>\n<li>normalizr (reference/steps/schema.js)</li>\n</ul>","tableOfContents":"<ul>\n<li>\n<p><a href=\"#update-history\">Update History</a></p>\n<ul>\n<li>\n<p><a href=\"#branches\">Branches</a></p>\n<ul>\n<li><a href=\"#1-step-1\">1. step-1</a></li>\n<li><a href=\"#2-step-2\">2. step-2</a></li>\n<li><a href=\"#3-step-3\">3. step-3</a></li>\n<li><a href=\"#4-step-4\">4. step-4</a></li>\n<li><a href=\"#6-step-6\">6. step-6</a></li>\n<li><a href=\"#7-step-7\">7. step-7</a></li>\n<li><a href=\"#8-step-8\">8. step-8</a></li>\n<li><a href=\"#9-step-9\">9. step-9</a></li>\n<li><a href=\"#10-main\">10. Main</a></li>\n</ul>\n</li>\n<li><a href=\"#unit-test\">Unit Test</a></li>\n<li><a href=\"#issues\">Issues:</a></li>\n<li><a href=\"#reference\">Reference</a></li>\n<li><a href=\"#things-to-todo\">Things to TODO</a></li>\n</ul>\n</li>\n</ul>"},"previous":{"fields":{"id":"e3bb0f44-4819-556c-8511-7402303e36c5","title":"0428","slug":"/misc/0428/"},"excerpt":"Installation elasticsearch-7.0.0-darwin-x86_64.tar.gz metricbeat-7.0.0-darwin-x86_64.tar.gz kibana-7.0.0-darwin-x86_64.tar.gz google-cloud…"},"next":{"fields":{"id":"6f004260-a55d-5a2d-8146-d197509fd980","title":"TODO","slug":"/misc/TODO/"},"excerpt":"LEARN SUITE https://contribute.BestITConsulting.com/products/6 TEST DATA MANAGEMENT https://contribute.BestITConsulting.com/products/114"}},"pageContext":{"id":"dfcc8a86-17af-5c8c-b831-9fe4fa51bf0e","prevId":"e3bb0f44-4819-556c-8511-7402303e36c5","nextId":"6f004260-a55d-5a2d-8146-d197509fd980"}},"staticQueryHashes":["1576573137","63159454"]}